home *** CD-ROM | disk | FTP | other *** search
/ Risc World 3 / Risc World 3.iso / SOFTWARE / ISSUE6 / PD / PDF / pdf / c++ / PrintDialog < prev    next >
Text File  |  2003-01-21  |  11KB  |  365 lines

  1. #include "Printer.h"
  2. #include "PrintDialog.h"
  3. #include "DocView.h"
  4. #include "Document.h"
  5. #include "GuiTargets.h"
  6. #include "UserEvents.h"
  7. #include "GuiGadget.h"
  8. #include "strstream.h"
  9. #include <stdlib.h>
  10. #include "guiTask.h"
  11. #include "NumberField.h"
  12. #include "fstream.h"
  13. #include "ChoicesFilePath.h"
  14. #include "uCompare.h"
  15. class PrintSetup
  16. {
  17.   public:
  18.     PrintSetup(GuiWindow& printDialog);
  19.     void getFlags(int &flags);
  20.  
  21.   private:
  22.     GuiWindow       mainWin;
  23.     GuiWindow&      printDialog;
  24.     GuiOptionButton reversesSheets;
  25.     GuiOptionButton turnsPaperOver;
  26.     GuiOptionButton isCollate;
  27.     GuiOptionButton isLandscape;
  28.     int             flags;
  29.    
  30.     GUI_DECLARE_EVENT_TARGETS(PrintSetup);
  31.  
  32.     GuiToolboxTarget showTarget;
  33.     Claim show(GuiToolboxEvent&,const GuiIdBlock&);
  34.  
  35.     GuiToolboxTarget setTarget;
  36.     Claim set(GuiToolboxEvent&,const GuiIdBlock&);
  37.  
  38.     GuiToolboxTarget saveTarget;
  39.     Claim save(GuiToolboxEvent&,const GuiIdBlock&);
  40. };
  41.  
  42. //*************************************************************************
  43.  
  44. PrintSetup::PrintSetup(GuiWindow& prDialog)
  45.  : mainWin("printSetup"),
  46.    printDialog(prDialog),
  47.    reversesSheets(mainWin,1),
  48.    turnsPaperOver(mainWin,4),
  49.    isCollate(mainWin,5),
  50.    isLandscape(mainWin,0x1e),
  51.    flags(PrintData::IS_COLLATE),
  52.    showTarget(&printDialog,User_PrintShowSetup,this,PrintSetup::show),
  53.    setTarget(&mainWin,User_PrintSetSetup,this,PrintSetup::set),
  54.    saveTarget(&mainWin,User_PrintSaveSetup,this,PrintSetup::save)
  55. {
  56.   string file=getChoicesFilePath("PrintSetup");
  57.   char buf[128];
  58.   ifstream in(file.c_str());
  59.   if (!in) return;
  60.  
  61.   while (in.getline(buf,sizeof(buf)))
  62.   {
  63.     if (uStartsWith(buf,"Reverse:"))        { if  (buf[8]=='1')  flags |= PrintData::IS_REVERSES_SHEETS; }
  64.     else if (uStartsWith(buf,"TurnsOver:")) { if  (buf[10]=='1') flags |= PrintData::IS_TURNS_PAPER_OVER; }
  65.     else if (uStartsWith(buf,"Collate:"))   { if  (buf[8]=='0')  flags &= ~PrintData::IS_COLLATE; }
  66.     else if (uStartsWith(buf,"Landscape:")) { if  (buf[10]=='1') flags |= PrintData::IS_LANDSCAPE;}
  67.   }
  68. }
  69.  
  70. //*************************************************************************
  71.  
  72. void PrintSetup::getFlags(int& f)
  73. {
  74.   f &=~ (PrintData::IS_REVERSES_SHEETS |
  75.          PrintData::IS_TURNS_PAPER_OVER |
  76.          PrintData::IS_COLLATE |
  77.          PrintData::IS_LANDSCAPE          
  78.          );
  79.   f |=flags;
  80. }
  81.  
  82. //*************************************************************************
  83.  
  84.  
  85. Claim PrintSetup::show(GuiToolboxEvent&,const GuiIdBlock&)
  86. {
  87.   mainWin.showAsMenuCentred(printDialog,&printDialog);
  88.   reversesSheets.set(flags & PrintData::IS_REVERSES_SHEETS);
  89.   turnsPaperOver.set(flags & PrintData::IS_TURNS_PAPER_OVER);
  90.   isCollate.set(flags & PrintData::IS_COLLATE);
  91.   isLandscape.set(flags & PrintData::IS_LANDSCAPE);
  92.   return CLAIM;
  93. }
  94.  
  95. //*************************************************************************
  96.  
  97.  
  98. Claim PrintSetup::set(GuiToolboxEvent& ev,const GuiIdBlock&)
  99. {
  100.   flags  = (reversesSheets.isOn()?PrintData::IS_REVERSES_SHEETS:0);
  101.   flags |= (turnsPaperOver.isOn()?PrintData::IS_TURNS_PAPER_OVER:0);
  102.   flags |= (isCollate.isOn()?PrintData::IS_COLLATE:0);
  103.   flags |= (isLandscape.isOn()?PrintData::IS_LANDSCAPE:0);
  104.   ev.eventCode=User_PrintDialogOpen;
  105.   GuiTask::raiseEvent(mainWin,ev);
  106.   return CLAIM;
  107. }
  108.  
  109. //*************************************************************************
  110.  
  111.  
  112. Claim PrintSetup::save(GuiToolboxEvent& ev,const GuiIdBlock& idBlock)
  113. {
  114.   set(ev,idBlock);
  115.   
  116.   string file=getChoicesFilePath("PrintSetup");
  117.   ofstream out(file.c_str());
  118.   if (!out) return CLAIM;
  119.  
  120.   out << "Reverse:" << (flags & PrintData::IS_REVERSES_SHEETS ? '1': '0') << endl
  121.       << "TurnsOver:" << (flags & PrintData::IS_TURNS_PAPER_OVER ? '1': '0') << endl
  122.       << "Collate:" << (flags & PrintData::IS_COLLATE ? '1': '0') << endl
  123.       << "Landscape:" << (flags & PrintData::IS_LANDSCAPE ? '1': '0') << endl;
  124.  
  125.   return CLAIM;
  126. }
  127. //*************************************************************************
  128. //*************************************************************************
  129. //*************************************************************************
  130.  
  131. class PrintDialog
  132. {
  133.   public:
  134.     friend bool PrintDialog_open(DocView& view, GuiWindow& ancestor, int page);
  135.     bool open(DocView& view,GuiWindow& ancestor,int page);
  136.  
  137.   private:
  138.     GuiWindow          mainWin;
  139.     PrintSetup         printSetup;
  140.     GuiRadioButton     isAll;
  141.     GuiRadioButton     isFrom;
  142.     NumberField        from;
  143.     NumberField        to;
  144.     GuiNumberRange     copies;
  145.     GuiOptionButton    isDoubleSided;
  146.     GuiOptionButton    isSide2;
  147.     GuiOptionButton    isStartEnd;
  148.     GuiOptionButton    isPamphlet;
  149.     GuiOptionButton    isSectionSize;
  150.     GuiLabel           startLabel;
  151.     NumberField        start;
  152.     GuiLabel           endLabel;
  153.     NumberField        end;
  154.     GuiLabel           pageLabel;
  155.     GuiLabel           sectionSizeLabel;
  156.     NumberField        sectionSize;
  157.     GuiLabel           sheetsLabel;
  158.     PrintData          data;
  159.  
  160.  
  161.     PrintDialog();
  162.     ~PrintDialog();
  163.  
  164.     void storeValues();
  165.     void showValues();
  166.  
  167.     void fade();
  168.  
  169.     GUI_DECLARE_EVENT_TARGETS(PrintDialog);
  170.     
  171.     GuiToolboxTarget cancelTarget;
  172.     Claim cancel(GuiToolboxEvent&,const GuiIdBlock&);
  173.  
  174.     GuiToolboxTarget setTarget;
  175.     Claim set(GuiToolboxEvent&,const GuiIdBlock&);
  176.  
  177.     GuiToolboxTarget printTarget;
  178.     Claim print(GuiToolboxEvent&,const GuiIdBlock&);
  179.  
  180.     GuiToolboxTarget fadeDialogTarget;
  181.     Claim fadeDialog(GuiToolboxEvent&,const GuiIdBlock&);
  182.  
  183.     GuiNullTarget nullTarget;
  184.     void printWait();
  185. };
  186.  
  187. //*************************************************************************
  188.  
  189. PrintDialog::PrintDialog()
  190.  : mainWin("print"),
  191.    printSetup(mainWin),
  192.    isAll(mainWin,0),
  193.    isFrom(mainWin,1),
  194.    from(mainWin,0xa),
  195.    to(mainWin,0x4),
  196.    copies(mainWin,0x19),
  197.    isDoubleSided(mainWin,0x80),
  198.    isSide2(mainWin,0x90),
  199.    isStartEnd(mainWin,0x93),
  200.    isPamphlet(mainWin,0x86),
  201.    isSectionSize(mainWin,0x94),
  202.    startLabel(mainWin,0x88),
  203.    start(mainWin,0x89),
  204.    endLabel(mainWin,0x8a),
  205.    end(mainWin,0x8b),
  206.    pageLabel(mainWin,0x92),
  207.    sectionSizeLabel(mainWin,0x8d),
  208.    sectionSize(mainWin,0x8e),
  209.    sheetsLabel(mainWin,0x8f),
  210.    cancelTarget(&mainWin,User_PrintDialogCancel,this,PrintDialog::cancel),
  211.    setTarget(&mainWin,User_PrintDialogSet,this,PrintDialog::set),
  212.    printTarget(&mainWin,User_PrintDialogPrint,this,PrintDialog::print),
  213.    fadeDialogTarget(&mainWin,User_PrintDialogFade,this,PrintDialog::fadeDialog)
  214. {
  215.   storeValues();
  216. }
  217.  
  218. //*************************************************************************
  219.  
  220. PrintDialog::~PrintDialog() {}
  221.  
  222. //*************************************************************************
  223.  
  224. bool PrintDialog::open(DocView& view, GuiWindow& ancestor,int page)
  225. {
  226.   mainWin.showAsMenuCentred(ancestor,&ancestor);
  227.  
  228.   char* name=0;
  229.   if (!_swix(PDriver_Info,_OUT(4),&name) && name) mainWin.setTitle(name);
  230.  
  231.   showValues();
  232.  
  233.  
  234. //  isAll.select();
  235.   data.from=page;
  236.   from.setNumber(page);
  237.   data.to=page;
  238.   to.setNumber(page);
  239.   data.document=&view.getDocument();
  240.   data.viewChoices=view.getChoices();
  241.   fade();
  242.   return 1;
  243. }
  244.  
  245. //*************************************************************************
  246.  
  247. void PrintDialog::fade()
  248. {
  249.   bool fade=isAll.isSelected();
  250.   from.fade(fade);
  251.   to.fade(fade);
  252.  
  253.   fade=!isDoubleSided.isOn();
  254.   
  255.   isSide2.fade(fade);
  256.  
  257.   isStartEnd.fade(fade);
  258.   bool startfade=(fade || !isStartEnd.isOn());
  259.   startLabel.fade(startfade);
  260.   start.fade(startfade);
  261.   endLabel.fade(startfade);
  262.   end.fade(startfade);
  263.   pageLabel.fade(startfade);
  264.  
  265.   isPamphlet.fade(fade);
  266.   if (!fade) fade=!isPamphlet.isOn();
  267.   isSectionSize.fade(fade);
  268.   if (!fade) fade=!isSectionSize.isOn();
  269.   sectionSizeLabel.fade(fade);
  270.   sectionSize.fade(fade);
  271.   sheetsLabel.fade(fade);
  272. }
  273.  
  274. //*************************************************************************
  275.  
  276. Claim PrintDialog::cancel(GuiToolboxEvent&,const GuiIdBlock&)
  277. {
  278.   showValues();
  279.   return CLAIM;
  280. }
  281.  
  282. //*************************************************************************
  283.  
  284. Claim PrintDialog::set(GuiToolboxEvent&,const GuiIdBlock&)
  285. {
  286.   storeValues();
  287.   return CLAIM;
  288. }
  289.  
  290. //*************************************************************************
  291.  
  292. Claim PrintDialog::print(GuiToolboxEvent&,const GuiIdBlock&)
  293. {
  294.   storeValues();
  295.   mainWin.hide();
  296.   nullTarget(this,PrintDialog::printWait); //wait for window to dissappear
  297.   return CLAIM;
  298. }
  299.  
  300. //*************************************************************************
  301.  
  302. void PrintDialog::printWait()
  303. {
  304.   nullTarget.destroy();
  305.   printSetup.getFlags(data.flags);
  306.   Printer_print(data);
  307. }
  308.  
  309. //*************************************************************************
  310.  
  311. void PrintDialog::storeValues()
  312. {
  313.   data.copies        = copies.getValue();
  314.   data.flags         = (isAll.isSelected() ? PrintData::IS_ALL : 0) |
  315.                        (isDoubleSided.isOn() ? PrintData::IS_DOUBLE_SIDED : 0) |
  316.                        (isSide2.isOn() ? PrintData::IS_SIDE2 : 0) |
  317.                        (isStartEnd.isOn() ? PrintData::IS_START_END : 0) |
  318.                        (isPamphlet.isOn() ? PrintData::IS_PAMPHLET : 0) |
  319.                        (isSectionSize.isOn() ? PrintData::IS_SECTION_SIZE : 0);
  320.   data.from          = from.getNumber();
  321.   data.to            = to.getNumber();
  322.   data.start         = start.getNumber();
  323.   data.end           = end.getNumber();
  324.   data.sectionSize   = sectionSize.getNumber();
  325. }
  326.  
  327. //*************************************************************************
  328.  
  329. void PrintDialog::showValues()
  330. {
  331.   copies.setValue(data.copies);
  332.   if (data.flags & PrintData::IS_ALL) isAll.select(); else isFrom.select();
  333.   isDoubleSided.set(data.flags & PrintData::IS_DOUBLE_SIDED);
  334.   isSide2.set(data.flags & PrintData::IS_SIDE2);
  335.   isStartEnd.set(data.flags & PrintData::IS_START_END);
  336.   isPamphlet.set(data.flags & PrintData::IS_PAMPHLET);
  337.   isSectionSize.set(data.flags & PrintData::IS_SECTION_SIZE);
  338.   from.setNumber(data.from);
  339.   to.setNumber(data.to);
  340.   start.setNumber(data.start);
  341.   end.setNumber(data.end);
  342.   sectionSize.setNumber(data.sectionSize);
  343.   fade();
  344. }
  345.  
  346. //*************************************************************************
  347.  
  348.  
  349. Claim PrintDialog::fadeDialog(GuiToolboxEvent&,const GuiIdBlock&)
  350. {
  351.   fade();
  352.   return CLAIM;
  353. }
  354.  
  355. //*************************************************************************
  356. //*************************************************************************
  357. //*************************************************************************
  358.  
  359. bool PrintDialog_open(DocView& view, GuiWindow& ancestor, int page)
  360. {
  361.   static PrintDialog p;
  362.   return p.open(view,ancestor,page);
  363. }
  364.  
  365.